package com.cskaoyan.javase._1extends._2conversion;

/**
 * 引用数据类型的类型转换
 * 1.引用数据类型的类型转换,转换的是什么的类型?
 *      转换的是引用的数据类型
 *      对象的类型是不可能转换的
 *
 * 2.引用数据类型的类型转换,要想发生,前提条件是什么?
 *      前提条件必须是存在继承,而且引用数据类型的类型转换,也必须发生在父子类关系中!!!
 *      如果不是继承关系的两个类发现类型转换,就会导致编译报错.
 *      继承的优点: 继承打破了引用数据类型的类型限制,有了继承以后,引用数据类型才出现了类型转换.
 *
 * 3.引用数据类型的类型转换的具体分类/具体应该是什么样的?
 *      基本数据类型的类型转换:
 *          a.自动类型转换,指的是不需要写额外代码,编译器自动完成类型转换
 *              "小" --> "大"
 *          b.强制类型转换,指的是由程序员手动写代码,强制编译器完成类型转换
 *              "大" --> "小"
 *
 * 引用数据类型的类型转换同样分为两大类:
 *      a.自动类型转换,指的是不需要写额外代码,编译器自动完成类型转换
 *      条件: 子类引用转换成父类引用,这个过程编译器自动完成,程序员不需要写额外代码
 *      特殊称呼: 从继承的方向来说,子到父,属于"向上转型".
 *      原因: 子类"is-a"父类,子类可以当成父类使用
 *
 *      b.强制类型转换,指的是由程序员手动写代码,强制编译器完成类型转换
 *      条件: 父类引用转换成子类引用,这个过程编译器不会自动完成,程序员需要写额外代码.
 *      语法:
 *        强转后的引用的类名 对象名 = (强转后的引用的类名)被强转类型的引用名
 *      特殊称呼: 从继承的方向来说,父到子,属于"向下转型".
 *      原因: 父类绝大多数情况下,都不能当子类使用
 *      所以把父类引用转换成子类引用是强制类型转换
 *
 * 关于"向下转型"后面再说,这里先了解和记住概念即可.
 *
 *
 * @since 16:30
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        IPhone ip = new IPhone();
        // 这里是把子类引用转换成父类引用
        Phone pp;
        pp = ip;
        // Phone p = new IPhone();

        Phone p = new Phone();
        // 这里父类引用强转成子类引用,编译是可以通过的
        IPhone ip2 = (IPhone) p;

    }
}

class Phone {
    double price;
    String brand;

    public void call() {
        System.out.println("打电话!");
    }
}

class IPhone extends Phone {
    public void siri() {
        System.out.println("嗨siri!");
    }
}